﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpGUiBaseInterface.h"

#include "FilePath.h"

/// \brief 快速注册自定义Ui编辑模式，建议写在cpp文件中 
/// \param editModeType 编辑模式类型， 与Db层编辑模式类型一一对应
/// \param ClassName  自定义编辑模式类名
/// \param moduleName 编辑模式所属模块名字
#define REGISTER_UI_EDIT_MODE_BEHAVIOUR(editModeType, ClassName, moduleName) \
    namespace \
    {\
        gcmp::OwnerPtr<gcmp::IUiEditModeBehavior> Create##ClassName(gcmp::IDocument* pDoc, int uiDocID) \
        {\
            return NEW_AS_OWNER_PTR(ClassName, pDoc, uiDocID, editModeType);\
        }\
        void Register##ClassName()\
        {\
            UiEditModeUtils::RegisterUiEditModeBehavior(editModeType, moduleName, Create##ClassName);\
        }\
        ONE_TIME_INITIALIZER(Register##ClassName);\
    }

namespace gcmp {

    class IUiEditModeBehavior;
    class IDocument;
    class IUiDocument;

    using FuncCreateUiEditModeBehavior
        = std::function<gcmp::OwnerPtr<gcmp::IUiEditModeBehavior>(gcmp::IDocument*, int)>;

    class GCMP_GUI_BASE_INTERFACE_EXPORT UiEditModeUtils
    {
    public:
        /// \brief 注册一个自定义Ui层编辑模式行为
        /// 
        ///  可通过使用 REGISTER_UI_EDIT_MODE_BEHAVIOUR 来进行快捷注册
        ///
        ///  \see REGISTER_UI_EDIT_MODE_BEHAVIOUR
        ///
        /// \param editModeType 编辑模式类型， 与DB层编辑模式对应， 用于和DB层编辑模式建立关系
        /// \param moduleName 待注册编辑模式所在的模块名字
        /// \param func 编辑模式行为创建函数
        static void RegisterUiEditModeBehavior(const std::wstring& editModeType, const std::wstring& moduleName, FuncCreateUiEditModeBehavior func);

        /// \brief 注销指定模块内的所有在平台注册过的自定义Ui层编辑模式行为
        /// 
        ///  此函数一般在模块卸载时被调用
        ///
        /// \param moduleName 模块名字
        static void UnregisterUiEditModeBehaviorInModule(const std::wstring& moduleName);

        /// \brief 获取当前编辑模式行为指针
        ///
        ///  若当前不在编辑模式内， 则返回nullptr
        /// \param pUiDocument Ui文档指针
        /// \return IUiEditModeBehavior* 当前的编辑模式行为指针
        static IUiEditModeBehavior* GetCurrentUiEditModeBehavior(IUiDocument* pUiDocument);

        /// \brief 刷新新编辑模式的Ui
        ///
        /// 如果修改了IUiEditModeBehavior的状态，导致编辑模式相关的Ui变化,
        /// 需要调用这个函数刷新，如果编辑模式创建之后Ui一直保持不变，则不需要刷新
        ///
        /// \param pUiDocument Ui文档指针
        /// \return true-成功；false-失败
        static bool RefreshEditModeUi(IUiDocument* pUiDocument);
    };
}

